1009F - Dominant Indices - CodeForces Solution


data structures dsu trees *2300

Please click on ads to support us..

C++ Code:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+1;
vector <int> f[MAXN],G[MAXN];
int len[MAXN],lson[MAXN],ans[MAXN];
/*f[i][j]	->	# subtree(i), dist = len[i]-j*/
inline void dfs(int p,int fa)	{
	for(int v:G[p])	{
		if(v==fa) continue;
		dfs(v,p);
		len[p]=max(len[p],len[v]+1);
		if(len[lson[p]]<=len[v]) lson[p]=v;
	}
}
inline void solve(int p,int fa)	{
	if(!lson[p])	{
		f[p].push_back(1);
		ans[p]=0;
		return ;
	}
	solve(lson[p],p);
	swap(f[lson[p]],f[p]);
	ans[p]=ans[lson[p]];
	f[p].push_back(1);
	if(f[p][ans[p]]==1) ans[p]=len[p];
	for(int v:G[p])	{
		if(v==fa||v==lson[p]) continue;
		solve(v,p);
		for(int x=0;x<=len[v];++x)	{
			int d=len[p]-(len[v]-x+1);
			f[p][d]+=f[v][x];
			if(f[p][d]>f[p][ans[p]]||(f[p][d]==f[p][ans[p]]&&d>ans[p])) ans[p]=d;
		}
	}
}
signed main()	{
	int n;
	scanf("%d",&n);
	for(int i=1;i<n;++i)	{
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(1,0);
	solve(1,0);
	for(int i=1;i<=n;++i) printf("%d\n",len[i]-ans[i]);
	return 0;
}//9686451989973131033


Comments

Submit
0 Comments
More Questions

415. Add Strings
22. Generate Parentheses
13. Roman to Integer
2. Add Two Numbers
515. Find Largest Value in Each Tree Row
345. Reverse Vowels of a String
628. Maximum Product of Three Numbers
1526A - Mean Inequality
1526B - I Hate 1111
1881. Maximum Value after Insertion
237. Delete Node in a Linked List
27. Remove Element
39. Combination Sum
378. Kth Smallest Element in a Sorted Matrix
162. Find Peak Element
1529A - Eshag Loves Big Arrays
19. Remove Nth Node From End of List
925. Long Pressed Name
1051. Height Checker
695. Max Area of Island
402. Remove K Digits
97. Interleaving String
543. Diameter of Binary Tree
124. Binary Tree Maximum Path Sum
1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts
501A - Contest
160A- Twins
752. Open the Lock
1535A - Fair Playoff
1538F - Interesting Function